/**
 * 百度ai人脸识别功能：需要在联网的情况下运行
 */
const AipFaceClient = require('baidu-aip-sdk').face
const fs = require('fs')
// 设置APPID/AK/SK
const APP_ID = '24593683'
const API_KEY = 'yK3ermaE7XFhZWnvuKjT6GMs'
const SECRET_KEY = 'dlCjKLQvwP2EohKAjDhNXG5Ux8W8S6C1'
// 新建一个对象，建议只保存一个对象调用服务接口
const client = new AipFaceClient(APP_ID, API_KEY, SECRET_KEY)
// 必填参数
const params = {
  image: new Buffer.from(
    fs.readFileSync(`${__dirname}/image/002.jpg`)
  ).toString('base64'),
  imageType: 'BASE64', //图片类型
}
const { image, imageType } = params

/**
 * 人脸检测
 * image：头像文件
 * imageType：文件类型
 * options：可选参数
 */
export const detect = async () => {
  try {
    const options = {
      face_field: 'age,beauty,gender,quality', //返回信息
      max_face_num: 2, //最多处理人脸的数目
      face_type: 'LIVE', //人脸的类型(生活照)
      liveness_control: 'LOW', //活体控制 检测结果中不符合要求的人脸会被过滤(LOW：较低)
    }
    const res = await client.detect(image, imageType, options)
    if (res && res.error_msg == 'SUCCESS') {
      // console.log('结果:',res.result)
      return res.result
    }
    return false
  } catch (error) {
    console.log('detect:', error)
    return error
  }
}

/**
 * 人脸注册
 * groupId：用户组id
 * userId：用户id
 * image：头像文件
 * imageType：文件类型
 * options：可选参数
 */

export const addUser = async () => {
  try {
    const groupId = 'group1' //用户组id
    const userId = 'user1' //用户id
    const options = {
      user_info: JSON.stringify({
        username: '琴时',
        gender: '男',
        age: 18,
        phone: '17322436183',
        site: '广州天河',
      }), //用户信息
      quality_control: 'NORMAL', //最多处理人脸的数目
      liveness_control: 'LOW', //活体控制 检测结果中不符合要求的人脸会被过滤(LOW：较低)
      action_type: 'REPLACE', //重复注册时,则会用新图替换库中该user_id下所有图片
    }

    const res = await client.addUser(image, imageType, groupId, userId, options)

    if (res && res.error_msg == 'SUCCESS') {
      return res.result
    }
    return false
  } catch (error) {
    console.log('addUser:', error)
    return error
  }
}

/**
 * 更新人脸
 * groupId：更新指定用户组下对应的信息
 * userId：指定用户id
 * image：头像文件
 * imageType：文件类型
 * options：可选参数
 */

export const updateUser = async () => {
  try {
    const groupId = 'group1'
    const userId = 'user1'
    const options = {
      user_info: JSON.stringify({
        username: '琴时',
        gender: '男',
        age: 18,
        phone: '17322436183',
        site: '广州天河',
      }), //用户信息
      quality_control: 'NORMAL', //最多处理人脸的数目
      liveness_control: 'LOW', //活体控制 检测结果中不符合要求的人脸会被过滤(LOW：较低)
      action_type: 'REPLACE', //重复注册时,则会用新图替换库中该user_id下所有图片
    }

    const res = await client.updateUser(
      image,
      imageType,
      groupId,
      userId,
      options
    )

    if (res && res.error_msg == 'SUCCESS') {
      return res.result
    }
    return false
  } catch (error) {
    console.log('updateUser:', error)
    return error
  }
}
/**
 * 人脸用户信息查询
 * groupId：用户组id
 * userId：用户id
 */

export const getUser = async () => {
  try {
    const groupId = 'group1'
    const userId = 'user1'
    const res = await client.getUser(userId, groupId)
    if (res && res.error_msg == 'SUCCESS') {
      return res.result
    }
    return false
  } catch (error) {
    console.log('getUser:', error)
    return error
  }
}

/**
 * 获取用户人脸列表
 * groupId：用户组id
 * userId：用户id
 */

export const faceGetList = async () => {
  try {
    const groupId = 'group1'
    const userId = 'user1'
    const res = await client.faceGetlist(userId, groupId)
    if (res && res.error_msg == 'SUCCESS') {
      return res.result
    }
    return false
  } catch (error) {
    console.log('faceGetList:', error)
    return error
  }
}

/**
 * 获取用户人脸列表
 * start：起始序号
 * length：最大数量
 */

export const getGroupList = async () => {
  try {
    // 如果有可选参数
    const options = {
      start: '0',
      length: '50',
    }
    const res = await client.getGrouplist(options)
    if (res && res.error_msg == 'SUCCESS') {
      return res.result
    }
    return false
  } catch (error) {
    console.log('getGroupList:', error)
    return error
  }
}
/**
 * 复制用户：用于将已经存在于人脸库中的用户复制到一个新的组。
 * user_id：用户id（由数字、字母、下划线组成），长度限制128B
 * src_group_id：从指定组里复制信息
 * dst_group_id：string	需要添加用户的组id
 */
export const userCopy = async () => {
  try {
    const userId = 'user1'

    // 如果有可选参数
    const options = {
      src_group_id: 'group1',
      dst_group_id: 'group2',
    }
    const res = await client.userCopy(userId, options)
    if (res && res.error_msg == 'SUCCESS') {
      return true
    }
    return false
  } catch (error) {
    console.log('userCopy:', error)
    return error
  }
}

/**
 * 删除人脸库指定用户
 * groupId：用户组id
 * userId：用户id
 */
export const faceDelete = async () => {
  try {
    const groupId = 'group2'
    const userId = 'user1'
    const faceToken = 'a8ed9fc74fd3e987e59820e7217d1c97'
    const res = await client.faceDelete(userId, groupId, faceToken)
    if (res && res.error_msg == 'SUCCESS') {
      return true
    }
    return false
  } catch (error) {
    console.log('faceDelete:', error)
    return error
  }
}

/**
 * 删除人脸库指定用户组
 * groupId：用户组id
 * userId：用户id
 */
export const groupDelete = async () => {
  try {
    const groupId = 'user'
    const res = await client.groupDelete(groupId)
    if (res && res.error_msg == 'SUCCESS') {
      return true
    }
    return false
  } catch (error) {
    console.log('groupDelete:', error)
    return error
  }
}

/**
 * 身份验证
 * idCardNumber：身份证号
 * name：姓名
 */
export const personVerify = async () => {
  try {
    const idCardNumber = '110233112299822211'
    const name = '张三'
    // 如果有可选参数
    const options = {
      quality_control: 'NORMAL', //图片质量（较低的质量要求 NORMAL）
      liveness_control: 'LOW', //较低的活体要求
    }

    const res = await client.personVerify(
      image,
      imageType,
      idCardNumber,
      name,
      options
    )
    // console.log('测试:',res)
    if (res && res.error_msg == 'SUCCESS') {
      return true
    }
    return false
  } catch (error) {
    console.log('personVerify:', error)
    return error
  }
}

/**
 * 在线活体检测
 * 人脸基础信息：包括人脸框位置，人脸空间旋转角度，人脸置信度等信息。
 * 人脸质量检测：判断人脸的遮挡、光照、模糊度、完整度等质量信息。可用于判断上传的人脸是否符合标准。
 * 基于图片的活体检测：基于单张图片，判断图片中的人脸是否为二次翻拍
 */
export const faceVerify = async () => {
  try {
    const image1 = new Buffer.from(
      fs.readFileSync(`${__dirname}/image/006.jpg`)
    ).toString('base64')
    const image2 = new Buffer.from(
      fs.readFileSync(`${__dirname}/image/008.jpg`)
    ).toString('base64')
    const res = await client.faceverify([
      {
        image: image1,
        image_type: 'BASE64',
      },
      {
        image: image2,
        image_type: 'BASE64',
      },
    ])
    // console.log('测试:', res)
    if (res && res.error_msg == 'SUCCESS') {
      return true
    }
    return false
  } catch (error) {
    console.log('faceVerify:', error)
    return error
  }
}

/**
 * 人脸对比
 * 两张人脸图片相似度对比：比对两张图片中人脸的相似度，并返回相似度分值；
 * 多种图片类型：支持生活照、证件照、身份证芯片照、带网纹照四种类型的人脸对比；
 * 活体检测：基于图片中的破绽分析，判断其中的人脸是否为二次翻拍（举例：如用户A用手机拍摄了一张包含人脸的图片一，用户B翻拍了图片一得到了图片二，并用图片二伪造成用户A去进行识别操作，
 * 这种情况普遍发生在金融开户、实名认证等环节。）；
 * 质量检测：返回模糊、光照等质量检测信息，用于辅助判断图片是否符合识别要求；
 * 用于比对多张图片中的人脸相似度并返回两两比对的得分，可用于判断两张脸是否是同一人的可能性大小。
 * 典型应用场景：如人证合一验证，用户认证等，可与您现有的人脸库进行比对验证。
 * image:头像文件
 * image_type:文件类型
 */
export const faceMatch = async () => {
  try {
    const params1 = {
      image: new Buffer.from(
        fs.readFileSync(`${__dirname}/image/006.jpg`)
      ).toString('base64'),
      image_type: 'BASE64',
    }
    const params2 = {
      image: new Buffer.from(
        fs.readFileSync(`${__dirname}/image/008.jpg`)
      ).toString('base64'),
      image_type: 'BASE64',
    }
    const res = await client.match([params1, params2])
    if (res && res.error_msg == 'SUCCESS') {
      return res.result.score
    }
    return false
  } catch (error) {
    console.log('faceMatch:', error)
    return error
  }
}
/**
 * 测试用例
 * 将src/index.js底部执行函数:selectTest(params)的实参params改为 4
 * 直接无法测试，请使用npm run dev或者去掉 export 使用node运行当前界面测试即可
 */

/* 人脸检测 */
detect().then(data => {
  // console.log('人脸检测:', data)
})
/* 人脸注册 */
addUser().then(data => {
  // console.log('人脸注册:', data)
})
/* 人脸更新 */
updateUser().then(data => {
  // console.log('人脸更新:', data)
})
/* 查询用户信息 */
getUser().then(data => {
  // const { user_info } = data.user_list[0]
  // console.log('用户信息:', JSON.parse(user_info))
})
/* 查询人脸列表 */
faceGetList().then(data => {
  // console.log('人脸列表:', data)
})
/* 查询人脸库列表 */
getGroupList().then(data => {
  // console.log('人脸列表:', data)
})
/* 复制用户 */
// userCopy().then(data => {
//     console.log('复制用户:', data)
// })
/* 人脸删除 */
// faceDelete().then(data => {
//     console.log('人脸删除:', data)
// })
/* 人脸库删除 */
// groupDelete().then(data => {
//     console.log('人脸库删除:', data)
// })
/* 人脸对比 */
faceMatch().then(data => {
  console.log('人脸对比:', data)
})
